Logo
Logo

Introdução ao ggplot2

O ggplot2 é um pacote estruturado de forma que seja possível criar gráficos elaborados a partir de múltiplas camadas. Os componentes básicos são os mesmos para todos os gráficos: um conjunto de dados, sistema de coordenadas e os objetos geométricos denominados geoms.

Para construir os gráficos, é utilizada a função ggplot( ). Após definir seus argumentos principais, outras funções são usadas em cadeia (formando camadas) , com o sinal +, para customizar o painel da maneira que o usuário preferir.

Gráfico de pontos

Definindo os principais elementos

A base utilizada para exemplificar as funções será a do arquivo student_habits_performance.csv.

# Instalando e carregando o pacote
if(!require("ggplot2")) install.packages("ggplot2")
library(ggplot2)

#Leitura da base de dados 
library(tidyverse)
performance = read_csv('bases/student_habits_performance.csv')
#Retirando o gênero "Other"
performance = performance %>% filter(gender!='Other')

performance


O primeiro argumento da função ggplot( ) é o data, o data.frame com os dados. Em seguida, precisamos mapear as propriedades visuais do gráfico com o mapping, utilizando o aes. No argumento aes, devem ser especificadas as variáveis dos eixos x e y, cores e símbolos para plotar os dados.

performance %>% ggplot(mapping = aes(x = study_hours_per_day, y = exam_score)) 

Percebam que o gráfico está vazio. Precisamos adicionar a camada com o elemento geom_. Neste caso, como queremos um gráfico de dispersão, vamos utilizar o geom_point( )

performance %>% 
  ggplot(aes(x = study_hours_per_day, y = exam_score)) +
  geom_point()

Pode-se definir outras especificações em uma função geom_. No gráfico abaixo, foram modificados o tamanho, o formato, a cor e a transparência (que varia de 0 a 1) dos pontos.

performance %>% 
  ggplot(aes(x = study_hours_per_day, y = exam_score)) +
  geom_point(size = 1,color = 'blue', shape = 24, alpha = 0.8)

É possível também, adicionar outros elementos geométricos no mesmo gráfico. Neste exemplo, foi adicionada uma reta de regressão linear pela função geom_smooth

performance %>% 
  ggplot(aes(x = study_hours_per_day, y = exam_score)) +
  geom_point() +
  geom_smooth(method='lm', # o método utilizado é o linear model
              se = F, # retirando o se (erro padrão)
              linewidth=2, # alterando a grossura da linha
              color='red') 

Agrupamentos

Além de mapear as variáveis que devem aparecer nos eixos, também se pode usar variáveis para mapear cores, forma, tamanho, transparência e outras características visuais dos objetos geométricos no gráfico. Isso permite sobrepor grupos de observações em um mesmo gráfico.

# Mapando as cores dos pontos de acordo com o gênero
performance %>% 
  ggplot(aes(x = study_hours_per_day, y = exam_score, color = gender)) + 
  geom_point()+
  geom_smooth(method='lm',se = F)

Escalas

o ggplot2 fornece escalas automáticas aos gráficos. No entanto, o controle sobre essas escalas é necessário para uma melhor visualização.

As funções utilizadas para controlar as escalas dos elementos de um gráfico do ggplot2 seguem um padrão. Todas possuem nomes iniciados com scale_, depois o nome do elemento estético (color, fill, x etc.) e, por fim, o tipo/nome da escala que será aplicada.

As especificações do scale_x_continuous e do scale_y_continuous incluem o breaks e label.

performance %>% 
  ggplot(aes(x = study_hours_per_day, y = exam_score, color = gender)) +
  geom_point()+
  geom_smooth(method='lm',se = F)+
  scale_y_continuous(breaks = seq(0, 100, 20))+ # sequência de 0 a 100 a cada 20 unidades
  scale_x_continuous(breaks = seq(0,max(performance$study_hours_per_day,1)))+ #sequência de 0 ao máximo de horas de estudo a cada 1 unidade
  scale_color_manual(values = c("Red","Blue"), #atribuindo cores vermelho e azul
                     labels = c("Mulher","Homem")) #mudando o texto das categorias

Rótulos

A função labs fornece rótulos personalizados para os eixos e legendas. Além disso, podem ser adicionados um título, subtítulo e legenda.

performance %>% 
  ggplot(aes(x = study_hours_per_day, y = exam_score, color = gender)) +
  geom_point()+
  geom_smooth(method='lm',se = F)+
  scale_y_continuous(breaks = seq(0, 100, 20))+
  scale_x_continuous(breaks = seq(0,max(performance$study_hours_per_day,1)))+
  scale_color_manual(values = c("Red","Blue"),
                     labels = c("Mulher","Homem")) + 
  labs(x = "Horas de Estudo Diário", 
       y = "Nota" ,
       color = "" , # foi deixado vazio dentro das aspas para tirar o o título da legenda
       title = "Relação entre Horas de Estudo e Nota",
       subtitle = "Student Habits vs Academic Performance: A Simulated Study",
       caption = "Fonte: https://www.kaggle.com/datasets") 

Temas

É possível alterar a aparência do gráfico manualmente usando o theme( ) ou utilizando temas prontos com funções theme_.

No link https://ggplot2.tidyverse.org/reference/ggtheme.html são apresentados os tipos de temas prontos do pacote.

# Usando o theme_classic( )
performance %>% 
  ggplot(aes(x = study_hours_per_day, y = exam_score, color = gender)) +
  geom_point()+
  geom_smooth(method='lm',se = F)+
  scale_y_continuous(breaks = seq(0, 100, 20))+
  scale_x_continuous(breaks = seq(0,max(performance$study_hours_per_day,1)))+
  scale_color_manual(values = c("Red","Blue"),
                     labels = c("Mulher","Homem"))+ # mudando o nome das categorias
  labs(x = "Horas de Estudo Diário", y = "Nota" ,color = "" ,
       title = "Relação entre Horas de Estudo e Nota",
       subtitle = "Student Habits vs Academic Performance: A Simulated Study",
       caption = "Fonte: https://www.kaggle.com/datasets") +
  theme_classic()

#Modificando o tema manualmente
performance %>% 
  ggplot(aes(x = study_hours_per_day, y = exam_score, color = gender)) +
  geom_point()+
  geom_smooth(method='lm',se = F)+
  scale_y_continuous(breaks = seq(0, 100, 20))+
  scale_x_continuous(breaks = seq(0,max(performance$study_hours_per_day,1)))+
  scale_color_manual(values = c("Red","Blue"),
                     labels = c("Mulher","Homem"))+ # mudando o nome das categorias
  labs(x = "Horas de Estudo Diário", 
       y = "Nota" ,
       color = "" , # tirando o rótulo 
       title = "Relação entre Horas de Estudo e Nota",
       subtitle = "Student Habits vs Academic Performance: A Simulated Study",
       caption = "Fonte: https://www.kaggle.com/datasets") +
  theme(axis.title = element_text(size = 13, face = 'bold',color = "gray19"), # colocando o título dos eixos em negrito e mudando a cor
        axis.title.x = element_text(margin = margin(t = 13)), # aumentando a margem entre o rótulo do eixo x e o gráfico
        axis.title.y = element_text(margin = margin(r = 13)), # aumentando a margem entre o rótulo do eixo y e o gráfico
        plot.title = element_text(face = 'bold'), # deixando o título do gráfico em negrito
        panel.grid = element_blank(), # retirando a borda do gráfico
        panel.background = element_rect(fill = 'lightpink')) # mudando a cor do fundo 

As cores podem ser definidas pelo nome padrão do R ou em código hexadecimal.

Cores padrão do R -> http://www.stat.columbia.edu/~tzheng/files/Rcolor.pdf

Cores em código hexadecimal -> Gerador de cores aleatórias https://coolors.co/

Facetas

Os facets reproduzem um gráfico para cada nível de uma determinada variável (ou combinação de variáveis). Os facets são criados usando funções que começam com facet_. Quando deseja-se criar gráficos para todas as categorias de uma variável categórica, pode-se usar o facet_wrap.

performance %>% 
  ggplot(aes(x = study_hours_per_day, y = exam_score, color = gender)) +
  geom_point()+
  geom_smooth(method='lm',se = F)+
  scale_y_continuous(breaks = seq(0, 100, 20))+
  scale_x_continuous(breaks = seq(0,max(performance$study_hours_per_day,1)))+
  scale_color_manual(values = c("Red","Blue"),
                     labels = c("Mulher","Homem"))+ 
  facet_wrap(~internet_quality)+ # reprodução do gráfico para categorias da variável qualidade de internet
  labs(x = "Horas de Estudo Diário", y = "Nota" ,color = "" ,
       title = "Relação entre Horas de Estudo e Nota",
       subtitle = "Student Habits vs Academic Performance: A Simulated Study",
       caption = "Fonte: https://www.kaggle.com/datasets") +
  theme(axis.title = element_text(size = 13, face = 'bold',color = "gray19"), 
        axis.title.x = element_text(margin = margin(t = 13)), 
        axis.title.y = element_text(margin = margin(r = 13)), 
        plot.title = element_text(face = 'bold'),
        panel.grid = element_blank(),
        panel.background = element_rect(fill = 'gray90'))

Quando o interesse for em reproduzir os gráficos para os níveis de duas variáveis categóricas, a função facet_grid( ) é utilizada.

performance %>% 
  ggplot(aes(x = study_hours_per_day, y = exam_score, color = gender)) +
  geom_point()+
  geom_smooth(method='lm',se = F)+
  scale_y_continuous(breaks = seq(0, 100, 20))+
  scale_x_continuous(breaks = seq(0,max(performance$study_hours_per_day,1)))+
  scale_color_manual(values = c("Red","Blue"),
                     labels = c("Mulher","Homem"))+ 
  facet_grid(part_time_job~internet_quality)+ # reprodução do gráfico para qualidade da internet e trabalho
  labs(x = "Horas de Estudo Diário", y = "Nota" ,color = "" ,
       title = "Relação entre Horas de Estudo e Nota",
       subtitle = "Student Habits vs Academic Performance: A Simulated Study",
       caption = "Fonte: https://www.kaggle.com/datasets") +
  theme(axis.title = element_text(size = 13, face = 'bold',color = "gray19"), 
        axis.title.x = element_text(margin = margin(t = 13)), 
        axis.title.y = element_text(margin = margin(r = 13)), 
        plot.title = element_text(face = 'bold'),
        panel.grid = element_blank(),
        panel.background = element_rect(fill = 'gray90'))

É possível alterar o texto das categorias dos facets com o argumento labeller ou modificando direto na base.

# base modificada 
perf_final = performance%>% mutate(internet_quality = factor(internet_quality,
                                      levels = c('Poor','Average','Good'),
                                      labels = c('Baixa','Média','Alta')))

# vetor com novos rótulos
job = c('Yes'='Sim','No'='Não')

perf_final %>% 
  ggplot(aes(x = study_hours_per_day, y = exam_score, color = gender)) +
  geom_point()+
  geom_smooth(method='lm',se = F)+
  scale_y_continuous(breaks = seq(0, 100, 20))+
  scale_x_continuous(breaks = seq(0,max(performance$study_hours_per_day,1)))+
  scale_color_manual(values = c("Red","Blue"),
                     labels = c("Mulher","Homem"))+ # mudando o nome das categorias
  facet_grid(part_time_job~internet_quality,
             labeller = labeller(part_time_job = job))+ # reprodução do gráfico para qualidade da internet e trabalho e mudanças nos textos das categorias
  labs(x = "Horas de Estudo Diário", y = "Nota" ,color = "" ,
       title = "Relação entre Horas de Estudo e Nota",
       subtitle = "Student Habits vs Academic Performance: A Simulated Study",
       caption = "Fonte: https://www.kaggle.com/datasets\n\nNota: As facetas representam:\n- Linhas: Trabalho de meio período (Sim/Não)\n- Colunas: Qualidade da Internet (Baixa/Média/Alta)") +
  theme(axis.title = element_text(size = 13, face = 'bold',color = "gray19"), 
        axis.title.x = element_text(margin = margin(t = 13)), 
        axis.title.y = element_text(margin = margin(r = 13)), 
        plot.title = element_text(face = 'bold'),
        panel.grid = element_blank(),
        panel.background = element_rect(fill = 'gray90'), 
        strip.background = element_rect(fill='white',color='gray19'), 
        strip.text = element_text(face='bold'), # deixando o texto das categorias em negrito
        legend.position = 'bottom') # alterando a posição da legenda

Gráfico de médias com intervalos de erro

O gráfico de médias com intervalos de erro é um método popular para comparar grupos com relação a uma variável numérica . A barra de erro pode representar um desvio padrão, um erro padrão da média ou um intervalo de confiança.

media_perf = performance %>% 
  group_by(gender) %>% 
  summarise(n = n(),
            media = mean(exam_score, na.rm=TRUE),
            dp = sd(exam_score, na.rm = TRUE),
            errop = dp/sqrt(n))

media_perf %>% 
  ggplot(aes(x = gender,y = media))+
  geom_point(size =3)+
  geom_errorbar(aes(ymin = media - 2*errop, # definindo o limite mínimo do eixo y
                    ymax = media + 2*errop),# definindo o limite máximo do eixo y
                width=0.2) # definindo o tamanho do traço

Podemos comparar a média entre mais grupos.

media_perf = performance %>% 
  group_by(gender,diet_quality) %>% 
  summarise(n = n(),
            media = mean(exam_score, na.rm=TRUE),
            dp = sd(exam_score, na.rm = TRUE),
            errop = dp/sqrt(n))

media_perf %>% 
  ggplot(aes(x = gender, y = media, color=diet_quality))+
  geom_point(size =3,
             position = position_dodge(width = 0.5))+ # argumento para evitar sobreposição dos pontos
  geom_errorbar(aes(ymin = media - 2*errop, 
                    ymax = media + 2*errop),
                width=0.2,
                position = position_dodge(width = 0.5)) + # argumento para evitar sobreposição das barras
  scale_color_discrete(labels = c('Média','Boa','Ruim'))+ # mmudando o texto das categorias
  labs(x = 'Gênero', y = 'Nota', color = 'Qualidade da dieta')

Gráfico de barras

Outra base utilizada será a do arquivo DENGBR23.csv

# Lendo os dados
dengue2023 = read_csv('bases/DENGBR23.csv') 

# Selecionando as colunas de interesse e modificando as categorias
dados = dengue2023 %>% select(3:ID_OCUPA_N) %>% 
  mutate(DT_NOTIFIC = as.Date(DT_NOTIFIC),
         REGIAO = case_when(
           SG_UF %in% c(11, 12, 13, 14, 15, 16, 17) ~ "Norte",
           SG_UF %in% c(21, 22, 23, 24, 25, 26, 27, 28, 29) ~ "Nordeste",
           SG_UF %in% c(50, 51, 52, 53) ~ "Centro-Oeste",
           SG_UF %in% c(31, 32, 33, 35) ~ "Sudeste",
           SG_UF %in% c(41, 42, 43) ~ "Sul"),
         CS_RACA = factor(CS_RACA, 
                          levels =c(1,2,3,4,5,9),
                          labels = c('Branca','Preta','Amarela','Parda',
                                     'Indígena','Ignorado')))

dados

O gráfico de barras ou colunas é utilizado para fazer comparações entre as categorias de uma variável qualitativa.

No gráfico abaixo, é apresentando um gráfico de barras de frequência de casos de dengue por raça.

dados %>% 
  filter(!CS_RACA == 'Ignorado',
         !is.na(CS_RACA)) %>% 
  ggplot(aes(x = CS_RACA))+
  geom_bar() # por default, o geom_bar() adota o stat = 'count' 

Outra forma de fazer o mesmo gráfico, é criando um tibble com uma coluna adicional com as frequências e utilizando-a para a construção do gráfico.

# criando a tabela

casos_raca = dados %>% 
  group_by(CS_RACA) %>% 
  summarize(n = n())

casos_raca
# plotando

casos_raca %>%   
  filter(!CS_RACA == 'Ignorado',
                        !is.na(CS_RACA)) %>% 
  ggplot(aes(x = CS_RACA,y = n))+
  geom_bar(stat='identity') # o 'identity' serve para indicar à função que as barras deverão ser plotadas de acordo com os valores do y

As barras podem ser customizadas dentro da função geom_bar com o fill e color. Esses argumentos controlam as cores do preenchimento e do contorno da barra, respectivamente. Também usa-se o labs para tratar os rótulos do gráfico.

casos_raca %>% 
  filter(!CS_RACA == 'Ignorado',
         !is.na(CS_RACA)) %>% 
  ggplot(aes(x = CS_RACA,y = n))+
  geom_bar(stat = 'identity',
           fill = 'cornflowerblue', # mudando a cor de preenchimento
           color='black')+ # mudando a cor do contorno
  scale_y_continuous(labels = scales::number_format(big.mark = '.',decimal.mark = ','))+ # tirando a notação científica 
  labs(x = 'Raça', y = 'Frequência') # alterando os rótulos

As formas comuns de apresentar as barras, são em ordem crescente e decrescente.

# ordenando as barras

##crescente
casos_raca %>% 
  filter(!CS_RACA == 'Ignorado',
         !is.na(CS_RACA))%>% 
  ggplot(aes(x = reorder(CS_RACA,n),y = n))+ # reordenando de acordo com o valor de n (frequência)
  geom_bar(stat = 'identity',fill = 'cornflowerblue',color='black')+
  scale_y_continuous(labels = scales::number_format(big.mark = '.',decimal.mark = ','))+
  labs(x = 'Raça', y = 'Frequência')

##decrescente
casos_raca %>% 
  filter(!CS_RACA == 'Ignorado',
         !is.na(CS_RACA)) %>% 
  ggplot(aes(x = reorder(CS_RACA,-n),y = n))+ # reordenando de acordo com o valor de -n
  geom_bar(stat = 'identity',fill = 'cornflowerblue',color='black')+
  scale_y_continuous(labels = scales::number_format(big.mark = '.',decimal.mark = ','))+
  labs(x = 'Raça', y = 'Frequência')

Para incluir os valores observados nas barras, usa-se o geom_text, que é utilizado para incluir uma camada de texto. No mapeamento do geom_text foram incluídos como rótulos os valores n e o vjust para controlar o alinhamento vertical (hjust controla o alinha horizontal).

casos_raca %>% 
  filter(!CS_RACA == 'Ignorado',
         !is.na(CS_RACA))%>% 
  ggplot(aes(x = reorder(CS_RACA,n),y = n))+
  geom_bar(stat = 'identity',fill = 'cornflowerblue',color='black')+
  geom_text(aes(label=n),vjust = -0.5)+
  scale_y_continuous(labels = scales::number_format(big.mark = '.',decimal.mark = ','))+
  labs(x = 'Raça', y = 'Frequência')

Dependendo do tamanho dos rótulos dos eixos, é necessário fazer modificações nos textos para facilitar a visualização dos gráficos. Existem algumas formas para evitar a sobreposição dos rótulos:

  • Alterando a angulação dos rótulos com axis.text.x dentro da função theme( )
casos_raca %>% 
  filter(!CS_RACA == 'Ignorado',
         !is.na(CS_RACA))%>% 
  ggplot(aes(x = reorder(CS_RACA,n),y = n))+
  geom_bar(stat = 'identity',fill = 'cornflowerblue',color='black')+
  geom_text(aes(label=n),vjust = -0.5)+
  scale_y_continuous(labels = scales::number_format(big.mark = '.',decimal.mark = ','))+
  labs(x = 'Raça', y = 'Frequência')+
  theme(axis.text.x = element_text(angle=45,hjust = 1))

  • Escalonando os rótulos com o scale_x_discrete por meio do guide
casos_raca %>% 
  filter(!CS_RACA == 'Ignorado',
         !is.na(CS_RACA))%>% 
  ggplot(aes(x = reorder(CS_RACA,n),y = n))+
  geom_bar(stat = 'identity',fill = 'cornflowerblue',color='black')+
  geom_text(aes(label=n),vjust = -0.5)+
  scale_y_continuous(labels = scales::number_format(big.mark = '.',decimal.mark = ','))+
    labs(x = 'Raça', y = 'Frequência')+
  scale_x_discrete(guide=guide_axis(n.dodge=2))

  • Invertendo o gráfico com o coord_flip()
casos_raca %>% 
  filter(!CS_RACA == 'Ignorado',
         !is.na(CS_RACA))%>% 
  ggplot(aes(x = reorder(CS_RACA,n),y = n))+
  geom_bar(stat = 'identity',fill = 'cornflowerblue',color='black')+
  geom_text(aes(label=n),
            hjust=-0.5, # como as coordenadas foram invertidas, o hjust é modificado
            size=3)+ 
  scale_y_continuous(labels = scales::number_format(big.mark = '.',decimal.mark = ','))+
  labs(x = 'Raça', y = 'Frequência')+
  coord_flip()

Gráfico Barras agrupadas

O gráfico de barras agrupadas ajuda a avaliar a relação entre duas variáveis qualitativas.

O mapeamento do gráfico abaixo é definida pela raça (eixo x) e pelo sexo do indivíduo (fill). Desta forma, são construídas barras para cada raça com cores separadas de acordo com o sexo.

dados %>% 
  filter(!CS_RACA == 'Ignorado',
         !is.na(CS_RACA),
         !CS_SEXO == 'I')%>% 
  ggplot(aes(x = CS_RACA, fill= CS_SEXO ))+
  geom_bar() # por default, o geom_bar agrupado deixam as barras empilhadas (position ='stack')

Outra forma de apresentar essas informações é dispondo as barras lado a lado utilizando o argumento position ='dodge' dentro do geom_bar( ).

dados %>% 
  filter(!is.na(CS_RACA),
         !CS_SEXO == 'I')%>% 
  ggplot(aes(x = CS_RACA, fill= CS_SEXO ))+
  geom_bar(position='dodge')

Para trabalhar com as barras empilhadas na escala de proporção é preciso inserir o argumento position = 'fill' dentro do geom_bar().

dados %>% 
  filter(
         !is.na(CS_RACA),
         !CS_SEXO == 'I')%>% 
  ggplot(aes(x = CS_RACA, fill= CS_SEXO ))+
  geom_bar(position='fill')

É possível incluir os percentuais no gráfico, utilizando o geom_text()

#criando tabela com as contagens e proporções

casos_raca_genero = dados %>% 
  filter(CS_SEXO %in% c('F','M'),
         !is.na(CS_RACA)) %>% 
  group_by(CS_RACA,CS_SEXO) %>% 
  summarise(n = n()) %>% 
  mutate(prop = n/sum(n))

casos_raca_genero %>%  # Calcula posição central da barra
  ggplot(aes(x = CS_RACA, y = prop, fill = CS_SEXO)) + # mudando a ordem 
  geom_bar(stat='identity',position = 'fill') +
  geom_text(aes(label = scales::percent(prop,accuracy = 1)), # colocando a proporção decimal como porcentagem sem casa decimal
            position = position_stack(vjust = 0.5), # definindo a posição do texto
            size=3)+
  scale_y_continuous(breaks = seq(0, 1, 0.2), # definindo as quebras do eixo 
                     label = scales::percent, # definindo a escala em porcentagem
                     expand = expansion(add = c(0, 0.05))) + # grudando as barras no eixo 
  labs(x = 'Raça', y = 'Frequência', fill = 'Sexo') +
  theme_minimal()

Para alterar as cores das barras de acordo com as categorias do fill, utilizamos a função scale_fill_manual() com os argumentos:

  • breaks para definir a ordem as categorias na legenda

  • labels para definir o nome das categorias na legenda

  • values para definir a cor para cada categoria

casos_raca_genero %>%  
  ggplot(aes(x = CS_RACA, y = prop, fill = CS_SEXO)) +
  geom_bar(stat='identity',position = 'fill') +
  geom_text(aes(label = scales::percent(prop,accuracy = 1)),
            position = position_stack(vjust = 0.5),
            size=3)+
  scale_y_continuous(breaks = seq(0, 1, 0.2), 
                     label = scales::percent,
                     expand = expansion(add = c(0, 0.05))) +
  scale_fill_manual(breaks = c('F','M'),
                    labels = c('Feminino','Masculino'),
                    values = c('pink','cornflowerblue'))+
  labs(x = 'Raça', y = 'Frequência', fill = 'Sexo') +
  theme_minimal()

Gráfico de histogramas

O histograma é uma representação gráfica da distribuição de um conjunto de dados numéricos. Ele é usado para visualizar a frequência com que diferentes intervalos de valores ocorrem em um conjunto de dados.

performance %>% 
  ggplot(aes(x = exam_score))+
  geom_histogram() # por default, o geom_histogram() apresenta 30 classes(bins)

As modificações de cores são feitas da mesma forma que no gráfico de barras. Para modificar as classes, podemos utilizar os seguintes argumentos dentro do geom_histogram

  • bins para alterar quantidade de classes

  • binwidth para alterar a amplitude de todas as classes

  • breaks para definir intervalos com amplitudes diferentes

#bins
performance %>% 
  ggplot(aes(x = exam_score))+
  geom_histogram(fill = "blue",
                 color = "white",
                 bins = 20)+
labs(x = "Nota",
     y = "Frequência")

#binwidth
performance %>% 
  ggplot(aes(x = exam_score))+
  geom_histogram(fill = "blue",
                 color = "white",
                 binwidth = 10)+
labs(x = "Nota",
     y = "Frequência")

#breaks
performance %>% 
  ggplot(aes(x = exam_score))+
  geom_histogram(fill = "blue",
                 color = "white",
                 breaks = c(0,20,50,75,90,100))+
labs(x = "Nota",
     y = "Frequência")

Boxplot

O boxplot é uma representação usada para verificar a distribuição de uma variável por meio de seus quantis. Esse gráfico permite verificar os valores de mínimo, máximo e os quartis. Além disso, indica a existência de valores discrepantes (outliers).

performance %>% 
  ggplot(aes(y = exam_score))+
  geom_boxplot()

Para adicionar os limites (representados pelos bigodes) no gráfico de boxplot, utilizamos a função geom_errorbar.

performance %>% 
  ggplot(aes(y = exam_score))+
  geom_boxplot()+
  geom_errorbar(stat='boxplot', # definição necessária para a função entender quais são os limites 
                width = 0.1) # alterando o tamanho dos bigodes

É possível modificar a cor do boxplot usando fill e color , modificar outliersm(inclusive removê-los do gráfico) utilizando o argumento outlier.shape.

#modificando a forma dos outliers
performance %>% 
  ggplot(aes(y = exam_score))+
  geom_boxplot(fill ='cornflowerblue', 
               color='darkblue',
               outlier.shape = 2)+
  geom_errorbar(stat='boxplot',width = 0.2,color='darkblue')+
  labs(y = 'Nota')

#removendo os outliers
performance %>% 
  ggplot(aes(y = exam_score))+
  geom_boxplot(fill ='cornflowerblue', 
               color='darkblue',
               outlier.shape = NA)+
  geom_errorbar(stat='boxplot',width = 0.2,color='darkblue')+
  labs(y = 'Nota')

Assim como nos gráficos anteriores, é possível criar boxplots para cada categoria de uma variável categórica, especificando-a no mapping

# distribuição da nota de acordo com a variável part_time_job
performance %>% 
  ggplot(aes(x = part_time_job,y = exam_score))+
  geom_boxplot()+
  geom_errorbar(stat='boxplot',
                width=0.1)+
  labs(x = "Trabalho",
       y = "Nota",
       fill='Sexo')

# distribuição da nota de acordo com a variável part_time_job e gender
performance %>% 
  ggplot(aes(x = part_time_job,y = exam_score,fill=gender))+
  geom_boxplot(position = position_dodge(width=0.8), # alterando a proximdade entre as caixas 
               width = 0.5)+ #alterando o tamanho da caixa
  geom_errorbar(stat='boxplot',
                width=0.1,
                position = position_dodge(width=0.8))+ # alterando a posição das barras de erro (utilizar o mesmo argumento position do geom_boxplot para o alinhamento)
  labs(x = "Trabalho",
       y = "Nota",
       fill='Sexo')

performance %>% 
  ggplot(aes(x = part_time_job,y = exam_score,fill=gender))+
  geom_boxplot(position = position_dodge(width=0.8), 
               width = 0.5)+ 
  geom_errorbar(stat='boxplot',
                width=0.1,
                position = position_dodge(width=0.8))+ 
  scale_fill_manual(breaks = c('Female','Male'),
                    labels = c('Mulher','Homem'),
                    values = c('lightyellow','lightgreen'))+
  scale_x_discrete(labels = c('Não','Sim'))+
  labs(title= 'Distribuição da nota por gênero e trabalho',
       x = "Trabalho",
       y = "Nota",
       fill='Sexo')+
  theme_classic()

Gráfico de densidade

Outra forma de representar a ditribuição de uma variável quantitativa, é utilizando gráfico de densidade usando o geom_density

performance %>% 
  ggplot(aes(x = exam_score))+
  geom_density()

Para comparar distribuições entre as categorias de uma variável qualitativa, precisamos mapear dentro do mapping = aes().

performance %>% 
  ggplot(aes(x = exam_score,fill = gender))+
  geom_density(alpha = 0.4)+ # alterando a opacidade
  scale_fill_discrete(labels = c("Mulher","Homem"))+
  labs(x = 'Nota',
       y = 'Densidade',
       fill = 'Sexo')

Gráfico de Violino

Os gráficos de violinos também mostram a distribuição de uma variável quantitativa e é semelhante ao gráfico de densidade, porém ambos argumentos x e y são obrigatórios. Sua plotagem é espelhada e rotacionada em 90 graus.

#violino
performance %>% 
  ggplot(aes(x = gender,y = exam_score))+
  geom_violin()

Podemos combinar boxplots e os violinos.

performance %>% 
  ggplot(aes(x = gender,y = exam_score))+
  geom_violin(fill='cornflowerblue')+
  geom_boxplot(fill='darkorange',
               width = 0.5, # alterando o tamanho da caixa para o boxplot ficar dentro do violino
               outlier.shape = NA)+
  scale_x_discrete()

  labs(x = 'Sexo',
       y = 'Nota')+
  theme_classic()
NULL

Séries Temporais

casos_data = dados %>% group_by(DT_NOTIFIC) %>% 
  summarize(n_casos = n())

casos_data %>% ggplot(aes(x = DT_NOTIFIC,y = n_casos))+
  geom_line()

Formatando eixos com datas

Os eixos com as datas são formatadas pelas funções scale_x_date e scale_y_date. Os principais argumentos dessas funções são:

  • date_breaks para indicar as quebras no eixo

  • date_labels para indicar a formatação dos rótulos

Códigos de formatação de datas em R
Código Significado Exemplo
%a Dia da semana (abreviado) “Dom”
%A Dia da semana (completo) “Domingo”
%e Dia do mês (sem zero) “2”
%d Dia do mês (com zero) “02”
%m Mês (numérico, com zero) “12”
%b Mês (abreviado) “Dez”
%B Mês (completo) “Dezembro”
%y Ano (sem século) “23”
%Y Ano (com século) “2023”
casos_data %>% ggplot(aes(x = DT_NOTIFIC,y = n_casos))+
  geom_line(col='red', 
            linewidth=1, # alterando a grossura da linha
            linetype = 'dashed')+ # alterando o tipo da linha
  scale_x_date(date_breaks = '3 month',
               date_labels = '%b/%Y')+
  labs(x = 'Data',
       y = 'Casos')+
  theme_classic()

Para fazer gráfico de linha por categorias de uma variável qualitativa, especificamos a informação no mapping

casos_data_sexo = dados %>% 
  filter(CS_SEXO %in% c('F','M')) %>% 
  group_by(DT_NOTIFIC, CS_SEXO) %>% 
  summarize(n_casos = n())

casos_data_sexo %>% ggplot(aes(x = DT_NOTIFIC,y = n_casos, color = CS_SEXO))+
  geom_line(linewidth=1)+
  scale_x_date(date_breaks = '3 month',
               date_labels = '%B')+
  labs(x = 'Data',
       y = 'Casos')+
  theme_classic()

Supondo que estamos interessados em observar a evolução no número de casos por sexo e região. Podemos reproduzir o gráfico acima para todas as regiões do Brasil usando o facet_wrap.

# Agrupando os dados pela data, sexo e região
casos_regiao = dados %>% 
  filter(CS_SEXO %in% c('F','M')) %>% 
  group_by(DT_NOTIFIC, CS_SEXO, REGIAO) %>% 
  summarize(n_casos = n()) 

# plotando
casos_regiao %>% 
  ggplot(aes(x = DT_NOTIFIC, y = n_casos, color = CS_SEXO)) +
  geom_line(linewidth = 1) +
  facet_wrap(~REGIAO) +  
  scale_x_date(
    date_breaks = "3 months",
    date_labels = "%b\n%Y" ) + # o \n é utilizado para quebra de linha
  labs(x = "Data",
       y = "Número de Casos",
       color = "Sexo") +
  theme_classic() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1),  
    legend.position = "bottom")